home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 43 / Amiga Format CD43 (1999)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-09].iso / -serious- / archivers / xfd / developer / sources / asm / lecrunch.a < prev    next >
Text File  |  1999-06-14  |  8KB  |  380 lines

  1. * Programmheader
  2. *
  3. *    Name:        PCompress
  4. *    Author:        SDI
  5. *    Distribution:    PD
  6. *    Description:    XFD external decruncher for recognising LeCrunch
  7. *    Compileropts:    -
  8. *    Linkeropts:    -
  9. *
  10. * 1.0   02.02.98 : first tries
  11. * 1.1   17.08.98 : some more test
  12. * 1.2   06.12.98 : added Expand routine, reloc handling still missing
  13. * 1.3   08.12.98 : finally completed stuff, uses cached SysBase
  14.  
  15.         INCLUDE    "AINCLUDE:IncDirs.i"
  16.         INCLUDE    "lvo.i"
  17.  
  18.         INCLUDE    "libraries/xfdmaster.i"
  19.         INCLUDE "exec/memory.i"
  20.  
  21.         * head function for tests
  22. *        INCLUDE    "PrA:Projekte/xfd/Developer/Sources/ASM/xfdExeHead.a"
  23.  
  24. ForeMan        MOVEQ    #-1,D0
  25.         RTS
  26.  
  27.         DC.L    XFDF_ID
  28.         DC.W    1,0
  29.         DC.L    0,0,Slave1
  30.  
  31.         DC.B    "$VER: LeCrunch 1.3 (08.12.1998) by SDI",0
  32. N_LeCrunch    DC.B    'LeCrunch',0
  33.         EVEN
  34.  
  35. Slave1        DC.L    0        ;no more slaves
  36.         DC.W    2        ;version
  37.         DC.W    36        ;master version
  38.         DC.L    N_LeCrunch    ;name
  39.         DC.W    XFDPFF_RELOC    ;flags
  40.         DC.W    0
  41.         DC.L    RB_LeCrunch    ;recog buffer
  42.         DC.L    DB_LeCrunch    ;decrunch buffer
  43.         DC.L    0        ;recog segment
  44.         DC.L    0        ;decrunch segment
  45.         DC.W    0,0
  46.         DC.L    $278        ;MinBufSize
  47.  
  48. *************************************************************************
  49. *    Recog buffer function: receives buffer + length in A0/D0    *
  50. *************************************************************************
  51.  
  52. RB_LeCrunch    MOVEQ    #0,D0            ; False
  53.  
  54.         CMP.L    #$000003F3,(A0)
  55.         BNE.B    .No
  56.         CMP.L    #$00EE2449,$44(A0)
  57.         BNE.B    .No
  58.         MOVE.L    #$4E750902,D1
  59.         CMP.L    $214(A0),D1
  60.         BEQ.B    .Next
  61.         SUBQ.L    #4,A0
  62.         CMP.L    $214(A0),D1
  63.         BNE.B    .No
  64. .Next        CMP.L    #$05030201,$22C(A0)
  65.         BNE.B    .No
  66.         CMP.L    #$00010011,$238(A0)
  67.         BNE.B    .No
  68.         CMP.L    #$00510091,$23C(A0)
  69.         BNE.B    .No
  70.         CMP.L    #$01110211,$240(A0)
  71.         BNE.B    .No
  72.         CMP.L    #$04110811,$244(A0)
  73.         BNE.B    .No
  74.         CMP.L    #'LEC2',$274(A0)
  75.         BNE.B    .No
  76.         MOVEQ    #1,D0            ; True
  77. .No        RTS
  78.  
  79. WORKSIZE    EQU    1024    * security buffer
  80.  
  81. F1_DESTLEN2    EQU    $280    * offsets in source file
  82. F1_DESTLEN    EQU    $27C
  83. F1_SOURCELEN    EQU    $278
  84. F1_EXPCHAR    EQU    $284
  85. F1_SOURCE    EQU    $286
  86.  
  87. *************************************************************************
  88. *    Decrunch buffer function: receives xfdbiBufferInfo in A0    *
  89. *************************************************************************
  90.  
  91. DB_LeCrunch    MOVEM.L    D2-D7/A2-A6,-(A7)
  92.         MOVE.L    A0,A5
  93.         MOVEQ    #0,D6                * return value
  94.         MOVE.W    #XFDERR_NOMEMORY,xfdbi_Error(A5)
  95.         MOVEA.L    xfdbi_SourceBuffer(A5),A4
  96.         CMP.L    #'LEC2',$274(A4)
  97.         BEQ.B    .Next
  98.         SUBQ.L    #4,A4
  99. .Next        MOVE.L    F1_DESTLEN(A4),D5
  100.         ADD.L    #$100,D5
  101.         MOVE.L    D5,D0
  102.         MOVEQ    #0,D1
  103.         MOVE.L    xfdm_ExecBase(A6),A6
  104.         JSR    _LVOAllocMem(A6)
  105.         TST.L    D0
  106.         BEQ.B    .NoMem
  107.         MOVEA.L    D0,A3
  108.  
  109.         LEA    $100(A3),A1
  110.         ADD.L    F1_DESTLEN(A4),A1    * unpack buffer end
  111.         MOVEA.L    A1,A2
  112.         SUBA.L    F1_DESTLEN2(A4),A2    * start of unpack buffer
  113.         MOVE.L    F1_SOURCELEN(A4),D0
  114.         ADD.L    #F1_SOURCE,D0
  115.         LEA    (A4,D0.L),A0        * decrunch buffer end
  116.         MOVE.L    A6,-(A7)
  117.         BSR.B    Decrunch
  118.         MOVE.L    (A7)+,A6
  119.  
  120.         MOVE.W    F1_EXPCHAR(A4),D0
  121.         MOVEA.L    A2,A1
  122.         ADDA.L    F1_DESTLEN2(A4),A2
  123.         MOVEA.L    A3,A0
  124.         BSR.B    Expand
  125.  
  126.         MOVE.L    A3,A0
  127.         BSR.W    GetFileSize    * returns destination size in D4
  128.         MOVE.L    D4,D0
  129.         MOVE.L    D4,xfdbi_TargetBufLen(A5)
  130.         MOVE.L    D4,xfdbi_TargetBufSaveLen(A5)
  131.         MOVE.L    xfdbi_TargetBufMemType(A5),D1
  132.         JSR    _LVOAllocMem(A6)
  133.         MOVE.L    D0,xfdbi_TargetBuffer(A5)
  134.         BEQ.B    .NoMem2
  135.  
  136.         MOVEA.L    A3,A0
  137.         MOVEA.L    D0,A2
  138.         BSR.W    MakeFile
  139.  
  140.         CLR.W    xfdbi_Error(A5)
  141.         MOVEQ    #1,D6                * set true
  142. .NoMem2        MOVE.L    D5,D0
  143.         MOVE.L    A3,A1
  144.         JSR    _LVOFreeMem(A6)
  145. .NoMem        MOVE.L    D6,D0
  146.         MOVEM.L    (A7)+,D2-D7/A2-A6
  147.         RTS
  148.  
  149. *************************************************************************
  150. *    decrunch routine - copied from file (a bit modified)        *
  151. *                                    *
  152. *    gets following parameters:                    *
  153. *        A0    end of source file                *
  154. *        A1    end of destination file                *
  155. *        A2    start of destination file            *
  156. *************************************************************************
  157.  
  158. Expand        MOVEQ    #0,D1
  159. .exp1        MOVE.B    (A1)+,D1
  160.         CMP.W    D0,D1
  161.         BNE.B    .exp3
  162.         MOVEQ    #0,D2
  163.         MOVE.B    (A1)+,D2
  164.         BEQ.B    .exp3
  165.         MOVE.B    (A1)+,D1
  166. .exp2        MOVE.B    D1,(A0)+
  167.         DBRA    D2,.exp2
  168.         MOVE.B    D1,(A0)+
  169. .exp3        MOVE.B    D1,(A0)+
  170.         CMPA.L    A0,A2
  171.         BGT.B    .exp1
  172.         RTS    
  173.  
  174. Decrunch    MOVEQ    #-$80,D3
  175. Decrunch2    BSR.B    Func1
  176.         BCC.B    Func3
  177.         BSR.B    Func1
  178.         BCC.B    .DecEnd
  179.         MOVEQ    #3,D0
  180.         MOVEQ    #8,D2
  181. .DecLoop    SUBQ.W    #2,D2
  182.         MOVE.B    Data1B(PC,D0.W),D4
  183.         BSR.B    Func2
  184.         CMP.W    Data2W(PC,D2.W),D1
  185.         DBNE    D0,.DecLoop
  186.         MOVE.B    Data3B(PC,D0.W),D2
  187.         ADD.W    D1,D2
  188. .DecLoop2    MOVE.B    -(A0),-(A1)
  189.         DBRA    D2,.DecLoop2
  190. .DecEnd        MOVE.B    -(A0),-(A1)
  191.         CMPA.L    A1,A2
  192.         BLE.B    Func3
  193.         RTS    
  194.  
  195. Func1        ADD.B    D3,D3
  196.         BNE.B    .F1_1
  197.         MOVE.B    -(A0),D3
  198.         ADDX.B    D3,D3
  199. .F1_1        RTS    
  200.  
  201. Func2        MOVEQ    #0,D1
  202. .F2_1        BSR.B    Func1
  203.         ADDX.W    D1,D1
  204.         SUBQ.B    #1,D4
  205.         BPL.B    .F2_1
  206.         RTS    
  207.  
  208. Func3        MOVEQ    #4,D0
  209. .F3_1        BSR.B    Func1
  210.         BCC.B    .F3_2
  211.         SUBQ.W    #1,D0
  212.         BNE.B    .F3_1
  213. .F3_2        CLR.W    D1
  214.         MOVE.B    Data4B(PC,D0.W),D4
  215.         BMI.B    .F3_3
  216.         BSR.B    Func2
  217. .F3_3        MOVE.B    Data5B(PC,D0.W),D0
  218.         ADD.W    D1,D0
  219.         MOVEQ    #2,D4
  220.         BSR.B    Func2
  221.         MOVE.L    D1,D2
  222.         MOVE.B    Data6B(PC,D2.W),D4
  223.         ADD.W    D2,D2
  224.         BSR.B    Func2
  225.         ADD.W    Data7W(PC,D2.W),D1
  226.         MOVEA.L    A1,A6
  227.         ADDA.L    D1,A6
  228. .F3_4        MOVE.B    -(A6),-(A1)
  229.         DBRA    D0,.F3_4
  230.         CMPA.L    A1,A2
  231.         BLE.B    Decrunch2
  232.         RTS    
  233.  
  234. Data1B        DC.B    9,2,1,0
  235. Data2W        DC.W    $03FF,7,3,1
  236. Data3B        DC.B    $B,4,1,0
  237. Data4B        DC.B    9,1,0,-1,-1
  238. Data5B        DC.B    9,5,3,2,1
  239. Data6B        DC.B    3,5,5,6,7,8,9,$A
  240. Data7W        DC.W    $001,$011,$051,$091,$111,$211,$411,$811
  241.  
  242.         * gets target in A0
  243. GetFileSize    MOVEQ    #0,D3                * current hunk number
  244.         MOVE.L    8(A0),D7            * number of hunks
  245.         MOVE.L    D7,D4
  246.         LSL.L    #2,D4
  247.         ADD.L    #20,D4        * D4 holds size of destination file
  248.         LEA    (A0,D4.L),A0
  249. .MainLoop    MOVE.L    (A0)+,D0
  250.         ADDQ.L    #4,D4
  251.         CMP.W    #$03E9,D0
  252.         BEQ.B    .Code
  253.         CMP.W    #$03EA,D0
  254.         BEQ.B    .Code
  255.         CMP.W    #$03EB,D0
  256.         BEQ.B    .BSS
  257.         CMP.W    #$03EC,D0
  258.         BEQ.B    .Reloc
  259.         CMP.L    D3,D7
  260.         BGT.B    .MainLoop
  261.         RTS
  262.  
  263. .Code        MOVE.L    (A0)+,D0
  264.         LSL.L    #2,D0
  265.         ADDQ.L    #4,D4
  266.         ADD.L    D0,D4            * update size
  267.         LEA    (A0,D0),A0        * skip data
  268.         ADDQ.L    #1,D3            * next hunk
  269.         BRA.B    .MainLoop
  270.  
  271. .BSS        ADDQ.L    #1,D3            * next hunk
  272.         ADDQ.L    #4,A0            * skip size information
  273.         ADDQ.L    #4,D4            * update size
  274.         BRA.B    .MainLoop
  275.  
  276. .Reloc        MOVE.B    (A0)+,D1
  277.         LSL.W    #8,D1
  278.         MOVE.B    (A0)+,D1
  279.         CMP.W    #-1,D1
  280.         BNE.B    .DoRelHunk
  281.         ADDQ.L    #4,D4    * add space for finishing 0 in destination
  282.         MOVE.L    A0,D0            * 0xFFFF the end of hunk list
  283.         ADDQ.L    #3,D0
  284.         ANDI.W    #-4,D0                * round to long
  285.         MOVEA.L    D0,A0
  286.         BRA.B    .MainLoop            * end the reloc work
  287.  
  288. .DoRelHunk    MOVE.B    (A0)+,D0        * byte 4
  289.         LSL.W    #8,D0
  290.         MOVE.B    (A0)+,D0        * byte 3
  291.         SWAP    D0
  292.         MOVE.B    (A0)+,D0        * byte 2
  293.         LSL.W    #8,D0
  294.         MOVE.B    (A0)+,D0        * byte 1
  295.         ADD.L    #12,D4    * numrelocs, related hunk and one entry added
  296. .RLoop        MOVE.B    (A0)+,D0        * get next byte
  297.         BEQ.B    .Reloc        * zero --> finished that hunk, take next
  298.         CMP.B    #1,D0            * was == 01 ?
  299.         BEQ.B    .RLoop            * yes -> loop again
  300.         ADDQ.L    #4,D4                * added one entry more
  301.         BRA.B    .RLoop            * do next data
  302.  
  303.         * gets source in A0
  304.         * gets destination in A2
  305. MakeFile    MOVE.L    8(A0),D7            * number of hunks
  306.         MOVEQ    #0,D3                * current hunk number
  307.         MOVE.L    D7,D0
  308.         ADDQ.L    #4,D0
  309. .CopyHead    MOVE.L    (A0)+,(A2)+
  310.         DBRA    D0,.CopyHead
  311. .MainLoop    MOVE.L    (A0)+,D0
  312.         MOVE.L    D0,(A2)+
  313.         CMP.W    #$03E9,D0
  314.         BEQ.B    .Code
  315.         CMP.W    #$03EA,D0
  316.         BEQ.B    .Code
  317.         CMP.W    #$03EB,D0
  318.         BEQ.B    .BSS
  319.         CMP.W    #$03EC,D0
  320.         BEQ.B    .Reloc
  321.         CMP.L    D3,D7
  322.         BGT.B    .MainLoop
  323.         RTS
  324.  
  325. .Code        MOVE.L    (A0)+,D0
  326.         MOVE.L    D0,(A2)+
  327.         BEQ.B    .SkipCode
  328. .CopyCode    MOVE.L    (A0)+,(A2)+
  329.         SUBQ.L    #1,D0
  330.         BNE.B    .CopyCode
  331. .SkipCode    ADDQ.L    #1,D3                * next hunk
  332.         BRA.B    .MainLoop
  333.  
  334. .BSS        ADDQ.L    #1,D3                * next hunk
  335.         MOVE.L    (A0)+,(A2)+
  336.         BRA.B    .MainLoop
  337.  
  338. .Reloc        MOVEQ    #0,D1
  339.         MOVE.B    (A0)+,D1
  340.         LSL.W    #8,D1
  341.         MOVE.B    (A0)+,D1
  342.         CMP.W    #-1,D1
  343.         BNE.B    .DoRelHunk
  344.         CLR.L    (A2)+            * add finishing 0 in destination
  345.         MOVE.L    A0,D0            * 0xFFFF the end of hunk list
  346.         ADDQ.L    #3,D0
  347.         ANDI.W    #-4,D0                * round to long
  348.         MOVEA.L    D0,A0
  349.         BRA.B    .MainLoop            * end the reloc work
  350.  
  351. .DoRelHunk    MOVE.B    (A0)+,D0        * byte 4
  352.         LSL.W    #8,D0
  353.         MOVE.B    (A0)+,D0        * byte 3
  354.         SWAP    D0
  355.         MOVE.B    (A0)+,D0        * byte 2
  356.         LSL.W    #8,D0
  357.         MOVE.B    (A0)+,D0        * byte 1
  358.         MOVE.L    A2,A4        * store pointer
  359.         ADDQ.L    #4,A2
  360.         MOVE.L    D1,(A2)+
  361.         MOVE.L    D0,(A2)+
  362.         MOVE.L    D0,D2
  363.         MOVEQ    #1,D1        * number of relocs
  364. .RLoop        MOVEQ    #0,D0
  365.         MOVE.B    (A0)+,D0        * get next byte
  366.         BEQ.B    .RelocEnd    * zero --> finished that hunk, take next
  367.         LSL.L    #1,D0            * double it
  368.         ADD.L    D0,D2            
  369.         CMP.W    #2,D0            * was == 01 ?
  370.         BNE.B    .StoreReloc            * no -> call store func
  371.         ADD.L    #$1FA,D2        * yes -> add 0x1FA
  372.         BRA.B    .RLoop            * and read next data
  373. .StoreReloc    MOVE.L    D2,(A2)+
  374.         ADDQ.L    #1,D1
  375.         BRA.B    .RLoop
  376.  
  377. .RelocEnd    MOVE.L    D1,(A4)        * store numrelocs
  378.         BRA.B    .Reloc
  379.         END
  380.